#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <proc/readproc.h>

int get_process_info_by_pid(const pid_t target_pid)
{
    // 打开进程信息表
    PROCTAB *proc_table = openproc(PROC_FILLSTAT | PROC_FILLSTATUS); // 使用 PROC_FILLSTAT 和 PROC_FILLSTATUS 标志来填充基本状态信息
    if (proc_table == NULL) {
        perror("openproc failed");
        return -1;
    }

    proc_t proc_info;
    memset(&proc_info, 0, sizeof(proc_info));
    int found = 0;

    // 读取所有进程信息
    while (readproc(proc_table, &proc_info) != NULL) {
        if (proc_info.tid == target_pid) { // 注意：这里比较的是 tid（线程ID），在单线程进程中通常等于 PID。
            found = 1;
            printf("pid:%d cmd:%s state:%c\n", proc_info.tid, proc_info.cmd, proc_info.state);
            break;
        }
    }

    // 关闭进程信息表并释放资源
    closeproc(proc_table);

    if (!found) {
        printf("Process with PID %d not found.\n", target_pid);
        return -1;
    }

    return 0;
}

int get_process_info_by_name(const char* target_name)
{
    // 打开进程信息表
    PROCTAB *proc_table = openproc(PROC_FILLSTAT | PROC_FILLSTATUS); // 使用 PROC_FILLSTAT 和 PROC_FILLSTATUS 标志来填充基本状态信息
    if (proc_table == NULL) {
        perror("openproc failed");
        return -1;
    }

    proc_t proc_info;
    memset(&proc_info, 0, sizeof(proc_info));
    int found = 0;

    // 读取所有进程信息
    while (readproc(proc_table, &proc_info) != NULL) {
        if (strncmp(proc_info.cmd, target_name, sizeof(proc_info.cmd)-1) == 0)
        {
            printf("pid:%d cmd:%s state:%c\n", proc_info.tid, proc_info.cmd, proc_info.state);
            found ++;
        }
    }

    // 关闭进程信息表并释放资源
    closeproc(proc_table);

    if (!found) {
        printf("未发现进程名: %s \n", target_name);
        return -1;
    }

    return found;
}



int main(int argc, char *argv[]) {
    if(argc != 2) {
        fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
        return 1;
    }
    pid_t target_pid = atoi(argv[1]);

    if (get_process_info_by_pid(target_pid) != 0) {
        fprintf(stderr, "Failed to get information for PID %d\n", target_pid);
    }

    int count = get_process_info_by_name("sleep");
    if(count > 0){
        printf("发现%d个进程名: %s\n",count, "sleep");
    }

    return 0;
}